package com.army.study.utils;

import com.army.study.bean.*;
import com.army.study.database.DatabaseUtils;
import ohos.data.orm.OrmContext;
import ohos.utils.zson.ZSONObject;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

public class ChartDataUtils {

    private static final String BLUE_COLOR = "#0D9FFB";     // 蓝色
    private static final String WHITE_COLOR = "#FFFFFF";    // 白色
    private static final String GREEN_COLOR = "#41BA41";    // 绿色
    private static final String GRAY_COLOR = "#CDCACA";     // 灰色
    private static final String ORANGE_COLOR = "#FF9C28";   // 橙色

    private static final int PAGE_WIDTH = 360;              // 页面宽度
    private static final int IMG_WIDTH = 28;                // 图片宽度
    private static final double CARD_WIDTH_PERCENT = 0.6;   // 卡片宽度百分比
    private static final int DIMENSION_2X4 = 3;             // 尺寸2X4
    private static final String SHOW = "flex";              // 显示
    private static final String HIDE = "none";              // 隐藏
    private static final int TARGET_STEPS = 5000;           // 目标步数
    private static final int PROGRESS_PERCENT = 100;        // 进度百分比
    private static final int POINT_SIZE = 5;                // 点大小
    private static final int PERCENT_100 = 100;             // 百分比
    private static final double METER_PER_STEP = 0.6;       // 米/步

    /**
     * 获取数据列表中的图表
     * @param connect
     * @return
     */
    public static List<ChartPoint> getChartPoints(OrmContext connect) {
        return DatabaseUtils.getLastFourDaysValue(connect);
    }

    /**
     * 获取图表数据集
     * @param value
     * @param connect
     * @return
     */
    public static ChartValues getChartValues(String value, OrmContext connect) {
        ChartValues chartValues = new ChartValues();
        // 填充颜色 灰色
        chartValues.setFillColor(GRAY_COLOR);
        // 线的颜色 灰色
        chartValues.setStrokeColor(GRAY_COLOR);
        // 是否渐变色
        chartValues.setGradient(true);
        // 获取前三天的点集合
        List<ChartPoint> chartPoints = getChartPoints(connect);
        // 获取点的集合
        ChartPoint newChartPoint = getChartPoint(Integer.parseInt(value));

        // 加入今天的步数点
        chartPoints.add(newChartPoint);
        chartValues.setData(chartPoints);

        return chartValues;
    }

    /**
     * 获取图表点
     * @param value
     * @return
     */
    public static ChartPoint getChartPoint(int value) {
        ChartPoint chartPoint = new ChartPoint();
        // 点的数值, 超过1000只显示1000的高度
        chartPoint.setValue(value >= TARGET_STEPS ? TARGET_STEPS : value);
        // 点的描述
        chartPoint.setDescription(value + "");
        // 点的描述显示位置, 此处设置为点的上面
        chartPoint.setTextLocation(ChartPoint.TextLocation.TOP.toString());
        // 设置描述字体的颜色 灰色
        chartPoint.setTextColor(GRAY_COLOR);

        PointStyle pointStyle = new PointStyle();
        // 点的大小
        pointStyle.setSize(POINT_SIZE);
        // 点的颜色
        pointStyle.setFillColor(ORANGE_COLOR);
        // 点的外框颜色
        pointStyle.setStrokeColor(ORANGE_COLOR);
        // 点的样式, 此处设置为圆形
        pointStyle.setShape(PointStyle.PointShape.CIRCLE.toString().toLowerCase(Locale.ROOT));
        chartPoint.setPointStyle(pointStyle);

        return chartPoint;
    }

    /**
     * 获取js页的数据
     * @param value     步数
     * @param dimension 规格
     * @param connect   数据库连接
     * @return
     */
    public static ZSONObject getZSONObject(String value, int dimension, OrmContext connect) {
        ZSONObject result = new ZSONObject();
        int round = 0;
        // 如超过1000步, 完成度为100%
        if (Double.parseDouble(value) >= TARGET_STEPS) {
            round = PERCENT_100;
        } else {
            round = (int)Math.round( Double.parseDouble(value) / TARGET_STEPS * PROGRESS_PERCENT );
        }
        result.put("percent", round); // 当前百分比
        result.put("steps", value);   // 当前步数

        if (dimension == DIMENSION_2X4) {
            // 组装chartDatasets
            List<ChartValues> datasets = new ArrayList<>(1);
            // 获取点集数据
            ChartValues chartValues = getChartValues(value, connect);
            datasets.add(chartValues);
            // Chart图表数据
            result.put("datasets", datasets);
            // 里程
            result.put("mileage", Math.round(Integer.parseInt(value) * METER_PER_STEP));
        }

        return result;
    }
}
